package com.jdk8.stream;

import com.alibaba.fastjson.JSONObject;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Lesson10 {
    public static void main(String[] args) {

        Product prod1 = new Product(1L, 1, new BigDecimal("15"), "面包", "零食");
        Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
        Product prod3 = new Product(3L, 3, new BigDecimal("30"), "月饼", "零食");
        Product prod4 = new Product(4L, 3, new BigDecimal("30"), "青岛啤酒", "啤酒");
        Product prod5 = new Product(5L, 10, new BigDecimal("15"), "百威啤酒", "啤酒");
        List<Product> prodList = new ArrayList<Product>(){{add(prod1); add(prod2); add(prod3); add(prod4); add(prod5);}};
        //按照类目分组
        //System.out.println(JSONObject.toJSONString(prodList.stream().collect(Collectors.groupingBy(Product::getCategory))));
        //按照几个属性拼接分组
        //System.out.println(JSONObject.toJSONString(prodList.stream().collect(Collectors.groupingBy(item -> item.getCategory() + "_" + item.getName()))));
        //根据不同条件分组
        /*System.out.println(JSONObject.toJSONString(prodList.stream().collect(Collectors.groupingBy(item -> {
            if(item.getNum() < 3) {
                return "3";
            }else {
                return "other";
            }
        }))));*/
        //要实现多级分组，我们可以使用一个由双参数版本的Collectors.groupingBy工厂方法创 建的收集器，它除了普通的分类函数之外，还可以接受collector类型的第二个参数。那么要进 行二级分组的话，我们可以把一个内层groupingBy传递给外层groupingBy，并定义一个为流 中项目分类的二级标准
        /*System.out.println(JSONObject.toJSONString(prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.groupingBy(item -> {
                    if(item.getNum() < 3) {
                        return "3";
                    }else {
                        return "other";
                    }
                })))));*/
        //把收集器的结果转换为另一种类型

        System.out.println(JSONObject.toJSONString(prodList.stream().collect(Collectors.groupingBy(Product::getCategory,Collectors.mapping(Function.identity(), Collectors.toMap(Product::getPrice, Product::getId))))));
    }
}
